package com.sunbird.crm.base.configurate.thread;

import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @ClassName ThreadPoolConfig
 * @Descriptiom TODO 配置线程池
 * @Author Sunbird
 * @Date 2019/9/7 16:56
 * @Version 1.0
 **/
@Configuration
public class ThreadPoolConfig {
        //核心线程池大小
    private int corePoolSize = 50;

//     最大线程数
    private int maxPoolSize = 200;
    // 列队最大长度
    private int queueCapacity =1000;
     // 线程池维护线程所允许的空闲时间
    private int keepAliveSeconds =300;

    @Bean("threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(maxPoolSize);
        executor.setCorePoolSize(corePoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setKeepAliveSeconds(keepAliveSeconds);
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return  executor;
    }

    /**
     * @Author Sunbird
     * @Description //TODO 执行周期性或定时任务
     * @Date  2019/9/7
     * @Param
     * @return
     **/
    @Bean(name = "scheduledExecutorService")
    protected ScheduledExecutorService scheduledExecutorService(){
        return  new ScheduledThreadPoolExecutor
                (corePoolSize,new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()){
            @Override
            protected  void afterExecute(Runnable r,Throwable t){
                super.afterExecute(r,t);
            }
        };

    }
}
